`timescale 1ns / 1ps

module udp_layer #
(
		parameter      	   LOCAL_PORT_NUM = 16'hf000
)
(
		input          		reset,
		input          		app_tx_request,
		input          		app_tx_data_valid,
		input [7:0]				app_tx_data,
		input [15:0]   		app_tx_data_length,
		input [15:0]   		app_tx_dst_port,
		
		output			   	app_rx_data_valid,
		output wire [7:0] 	app_rx_data,
		output wire [15:0]	app_rx_data_length,
		output wire [15:0]	app_rx_port_num,
		
		input          		ip_tx_ready,
		input          		ip_tx_ack,
		output wire	   		udp_tx_ready,
		output wire	   		udp_tx_ack,
		
		input          		udp_tx_clk,
		output wire	   		udp_tx_request,
		output wire    		udp_tx_data_valid,
		output wire [7:0] 	udp_tx_data,
		output wire [15:0]	udp_tx_data_length,
		
		input             	udp_rx_clk,
		input             	udp_rx_data_valid,
		input [7:0]       	udp_rx_data
    );

udp_send #
(
	 .LOCAL_PORT_NUM        (LOCAL_PORT_NUM)  
)
udp_send_module 
(
    .udp_send_clk				(udp_tx_clk), 
    .reset						(reset), 
    .app_data_in_valid		(app_tx_data_valid), 
    .app_data_in				(app_tx_data), 
    .app_data_length			(app_tx_data_length), 
    .udp_dest_port			(app_tx_dst_port), 
    .app_data_request		(app_tx_request), 
    .udp_send_ready			(udp_tx_ready), 
    .udp_send_ack				(udp_tx_ack), 
    .ip_send_ready			(ip_tx_ready), 
    .ip_send_ack				(ip_tx_ack), 
    .udp_send_request		(udp_tx_request), 
    .udp_data_out_valid		(udp_tx_data_valid), 
    .udp_data_out				(udp_tx_data), 
    .udp_packet_length		(udp_tx_data_length)
    );
	 
udp_receive udp_receive_module 
(
    .udp_receive_clk			(udp_rx_clk), 
    .reset						(reset), 
    .udp_data_in_valid		(udp_rx_data_valid), 
    .udp_data_in				(udp_rx_data), 
    .app_data_out_valid		(app_rx_data_valid), 
    .app_data_out				(app_rx_data), 
    .app_data_length			(app_rx_data_length),
	 .app_data_src_port_num (app_rx_port_num)
    );
	 
endmodule
